/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ajustes.db;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 * Clase que se encarga de obtener las empresa a la que el usuario tiene acceso.
 * @author Jose Carlos Palma
 * @version v1.0.0
 * @see ajustes.db.EmpresaPermiso
 */
public class ListaEmpresaPermiso {
    
    private List<EmpresaPermiso> empresas;
    private Usuario user;
    
    
    /**
     * Crea una instancia de ListaEmpresaPermiso de un usuaio especifico
     * @param user Es el usuario
     * @see ajustes.db.Usuario
     */
    public ListaEmpresaPermiso(Usuario user){
        this.user = user;
        this.empresas = new ArrayList<EmpresaPermiso>();
    }
    
    /**
     * Carga las empresas a la que el usuario tiene permiso, y a su vez
     * por cada empresa las divisiones a las que tiene permiso
     * @param cnx es la conexion con la base de datos
     * @see ajustes.db.EmpresaPermiso#cargarDivisiones(java.sql.Connection) 
     */
    public void cargarEmpresas(Connection cnx){
        
        //Obtiene las empresa a la que el usuario tiene permiso
        //Nota: si el usuario es supervisor las devuelve todas
        StringBuilder sb = new StringBuilder();
        sb.append("SELECT EMPRESAID, NOMBRE");
        sb.append("  FROM EMPRESAS A");
        sb.append(" WHERE EXISTS (SELECT 1 ");
        sb.append("                 FROM DIVAUTORIZACIONES B");
        sb.append("                WHERE A.EMPRESAID = B.EMPRESAID");
        sb.append("                  AND B.USUARIOID  = ?");
        sb.append("                  AND B.OPCIONID IN (318,312,321))");
        sb.append("    OR ? = 1");
        
        try {
            PreparedStatement stmt = cnx.prepareStatement(sb.toString());
            stmt.setInt(1, getUser().getId());
            stmt.setInt(2, getUser().getId());
            
            ResultSet rs = stmt.executeQuery();
            
            //Recorre todas las empresa a las que tiene permiso
            while( rs.next() ){
                EmpresaPermiso emp = new EmpresaPermiso(getUser(), rs.getInt(1), rs.getString(2));
                //Carga las divisiones que tiene permiso de dicha empresa
                emp.cargarDivisiones(cnx);
                //Agrega a la lista
                this.empresas.add(emp);
            }
            
        } catch (SQLException ex) {
            Logger.getLogger(EmpresaPermiso.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }

    /**
     * Retorna el listado de empresa.
     * @return the empresas
     */
    public List<EmpresaPermiso> getEmpresas() {
        return empresas;
    }
    
    
    /**
     * Devuelve una empresa a la que tiene permiso el usuario.
     * @param empresaId es el id de la empresa
     * @return un EmpresaPermiso con la empresa, si no existe
     * devuelve null.
     */
    public EmpresaPermiso getEmpresaPermiso(int empresaId){
        for( EmpresaPermiso ep : empresas ){
            if( ep.getEmpresa().getId() == empresaId ) return ep;
        }
        return null;
    }
    
    /**
     * Devuelve una empresa a la que tiene permiso el usuario.
     * @param emp Es la empresa
     * @return un EmpresaPermiso con la empresa, si no existe
     * devuelve null.
     */
    public EmpresaPermiso getEmpresaPermiso(Empresa emp){
        return getEmpresaPermiso(emp.getId());
    }

    

    /**
     * Devuelve el usuario.
     * @return the user
     */
    public Usuario getUser() {
        return user;
    }

    
}
